/*
原型模式（Prototype Pattern）是一种创建型设计模式，它通过复制现有对象来创建新对象，而不是通过实例化类来创建。
原型模式通过克隆（Clone）的方式来创建对象，可以避免直接使用new关键字创建对象，从而提高了对象的创建效率。

在原型模式中，有以下几个角色：

● 原型（Prototype）：定义了克隆方法的接口。
● 具体原型（Concrete Prototype）：实现了克隆方法的具体类。
● 客户端（Client）：使用原型对象的客户端。

使用原型模式的主要思想是通过克隆已有的对象来创建新对象。
原型对象可以是一个已经存在的对象，也可以是一个新创建的对象。
当需要创建一个新对象时，可以通过克隆原型对象来创建。

下面是一个使用原型模式的C语言例程，用于克隆一个简单的矩形对象：
*/

#include <stdio.h>
#include <stdlib.h>

// 原型接口
typedef struct
{
    void *(*clone)();
} Prototype;

// 具体原型
typedef struct
{
    Prototype prototype;
    int width;
    int height;
} ConcretePrototype;

// 具体原型的克隆方法
void *clone(const ConcretePrototype *this)
{
    ConcretePrototype *prototype = (ConcretePrototype *)malloc(sizeof(ConcretePrototype));
    prototype->width = this->width;
    prototype->height = this->height;
    return prototype;
}

int main()
{
    // 创建原型对象
    ConcretePrototype prototype;
    prototype.prototype.clone = clone;
    prototype.width = 10;
    prototype.height = 20;

    // 克隆原型对象
    ConcretePrototype *clone = (ConcretePrototype *)prototype.prototype.clone(&prototype);

    // 输出克隆对象的宽度和高度
    printf("Clone Width: %d\n", clone->width);
    printf("Clone Height: %d\n", clone->height);

    // 释放克隆对象的内存
    free(clone);

    return 0;
}

/*
在上面的例程中，定义了原型接口Prototype，其中声明了克隆方法的接口。
然后，实现了具体原型类ConcretePrototype，其中实现了克隆方法。
在main函数中，首先创建了一个原型对象，并设置宽度和高度。
然后，通过调用原型对象的克隆方法来创建克隆对象。
最后，输出克隆对象的宽度和高度，并释放克隆对象的内存。

通过使用原型模式，我们可以通过克隆已有的对象来创建新对象，而无需直接使用new关键字创建对象。
这样可以提高对象的创建效率，并且避免了对象的构造过程。

需要注意的是，在C语言中，没有内置的克隆方法，需要手动实现克隆逻辑。
在上面的例程中，通过手动分配内存并将原型对象的属性复制给克隆对象来实现克隆方法。
*/